﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using JudoTec.cls;

namespace JudoTec.forms
{
    public partial class Semifinales : UserControl
    {
        // Variables de la BD
        MySqlDataAdapter adaptador;
        System.Data.DataSet datos;
        MySqlCommand comando;
        DataTable dt_Final;
        //DataTable dt_SemiFinal;
        MySqlConnection conexion;
        VentanaCompeticion miVentanaCompeticion;
        Resultados miResultado;


        int idCompeticion;
        public Semifinales(int id_Competicion , VentanaCompeticion ventanaCompeticion)
        {
            InitializeComponent();
            this.idCompeticion = id_Competicion;
            this.miVentanaCompeticion = ventanaCompeticion;
            dt_Final = obtenerTablaCombates(3);
            if (dt_Final.Rows.Count == 2)
            {
                rellenarFinal2(dt_Final);
                label12.Visible = true;
                panel2.Visible = true;
                btn_Guardar_Finales.Visible = true;
            }
            //Limitamos los valores que se pueden meter en las puntuaciones
            tb_Ptos_1A.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_1B.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_2A.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_2B.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_F1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_F2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_SF1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
            tb_Ptos_SF2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);

        }


        //Metodo que me obtiene todos los combates para una competicion y liga dadas
        private DataTable obtenerTablaCombates(int ronda)
        {
            conexion = cls.ConexionMySQL.IniciarConexion();
            // Consulta SQL en cadena string
            string consulta = "SELECT * FROM combates WHERE Ronda = "+ ronda +" AND Id_Competicion = " + this.idCompeticion;
            comando = new MySqlCommand(consulta, conexion);
            datos = new DataSet();
            adaptador = new MySqlDataAdapter();
            adaptador.SelectCommand = comando;
            adaptador.Fill(datos, "miTabla");
            DataTable tabla = datos.Tables["miTabla"];
            conexion.Close();
            return tabla;
        }

        //Boton que guarda los resultados de las semifinales y carga la final
        private void btn_Guardar_Semif_Click(object sender, EventArgs e)
        {
            DataTable semifinal = obtenerTablaCombates(2);
            ModificarCombatesRonda(semifinal, 2);
            //Rellenamos la tabla de la final
            rellenarFinal1();
            label12.Visible = true;
            panel2.Visible = true;
            btn_Guardar_Finales.Visible = true;
            //Insertamos los combates correspondientes
            inscribirCombatesRonda();

        }

        private void ModificarCombatesRonda(DataTable misCombates, int ronda)
        {
            //DataTable tablaCombates = obtenerTablaCombates(2);
            Combate miCombate;
            // string nombre;
            try
            {
                foreach (DataRow filaCombate in misCombates.Rows)
                {
                    miCombate = new Combate();
                    miCombate.Id_Combate = Convert.ToInt32(filaCombate["Id_Combate"]);
                    miCombate.Id_Competicion = Convert.ToInt32(filaCombate["Id_Competicion"]);
                    miCombate.Liga = Convert.ToInt32(filaCombate["Liga"]);
                    miCombate.Ronda = Convert.ToInt32(filaCombate["Ronda"]);
                    miCombate.Participante_Primero = Convert.ToInt32(filaCombate["Participante_Primero"]);
                    miCombate.Participante_Segundo = Convert.ToInt32(filaCombate["Participante_Segundo"]);
                    miCombate.Dni_1 = Convert.ToString(filaCombate["DNI_1"]); ;
                    miCombate.Dni_2 = Convert.ToString(filaCombate["DNI_2"]); ;
                    // Accedo mediante el name de los texbox a su contenido siendo el idCOmpeticion mas 1 para la puntuacion 1
                    // y idCombate +2 para la puntuacion 2
                    if (ronda == 2)
                    {
                        if (Convert.ToInt32(filaCombate["Liga"]) == 11)
                        {
                            miCombate.Puntuacion_1 = Convert.ToInt32(tb_Ptos_1A.Text);
                            miCombate.Puntuacion_2 = Convert.ToInt32(tb_Ptos_2B.Text);
                        }
                        if (Convert.ToInt32(filaCombate["Liga"]) == 22)
                        {
                            miCombate.Puntuacion_1 = Convert.ToInt32(tb_Ptos_1B.Text);
                            miCombate.Puntuacion_2 = Convert.ToInt32(tb_Ptos_2A.Text);
                        }
                    }
                    if (ronda == 3)
                    {
                        if (Convert.ToInt32(filaCombate["Liga"]) == 11)
                        {
                            miCombate.Puntuacion_1 = Convert.ToInt32(tb_Ptos_F1.Text);
                            miCombate.Puntuacion_2 = Convert.ToInt32(tb_Ptos_F2.Text);
                        }
                        if (Convert.ToInt32(filaCombate["Liga"]) == 22)
                        {
                            miCombate.Puntuacion_1 = Convert.ToInt32(tb_Ptos_SF1.Text);
                            miCombate.Puntuacion_2 = Convert.ToInt32(tb_Ptos_SF2.Text);
                        }
                    }
                    miCombate.Activo = Convert.ToBoolean(filaCombate["Activo"]);
                    miCombate.ModificarCombate();
                }
                MessageBox.Show("Combates Guardados con Exito", "Mensaje Informativo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception)
            {
                MessageBox.Show("Error al Guardar los Combates", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }



        //Metodo que me rellena la tabla de la final en base  a los datos de la semifinal
        private void rellenarFinal1()
        {
            //Ahora vamos a generar los datos para la final........
            if (Convert.ToInt32(tb_Ptos_1A.Text) > Convert.ToInt32(tb_Ptos_2B.Text))
            {
                lb_Nombre_F1.Text = lb_Nombre_1A.Text;
                lb_Nombre_SF1.Text = lb_Nombre_2B.Text;
                lb_DNI_F1.Text = lb_DNI_1A.Text;
                lb_DNI_SF1.Text = lb_DNI_2B.Text;
            }
            else
            {
                lb_Nombre_F1.Text = lb_Nombre_2B.Text;
                lb_Nombre_SF1.Text = lb_Nombre_1A.Text;
                lb_DNI_F1.Text = lb_DNI_2B.Text;
                lb_DNI_SF1.Text = lb_DNI_1A.Text;
            }
            //Ahora vamos a generar los datos para la final........
            if (Convert.ToInt32(tb_Ptos_1B.Text) > Convert.ToInt32(tb_Ptos_2A.Text))
            {
                lb_Nombre_F2.Text = lb_Nombre_1B.Text;
                lb_Nombre_SF2.Text = lb_Nombre_2A.Text;
                lb_DNI_F2.Text = lb_DNI_1B.Text;
                lb_DNI_SF2.Text = lb_DNI_2A.Text;
            }
            else
            {
                lb_Nombre_F2.Text = lb_Nombre_2A.Text;
                lb_Nombre_SF2.Text = lb_Nombre_1B.Text;
                lb_DNI_F2.Text = lb_DNI_2A.Text;
                lb_DNI_SF2.Text = lb_DNI_1B.Text;
            }
            tb_Ptos_F1.Text = "0";
            tb_Ptos_F2.Text = "0";
            tb_Ptos_SF1.Text = "0";
            tb_Ptos_SF2.Text = "0";
        }

        //Metodo que se encarga de rellenarme la tabla de la final cargandola de la BD
        private void rellenarFinal2(DataTable miFinal)
        {
            string consulta;
            conexion = cls.ConexionMySQL.IniciarConexion();
            // Consulta SQL en cadena string
            consulta = "SELECT * FROM Participantes WHERE Activo = 1";
            // Relacionamos la consulta con la conexion mediante el objeto comando
            comando = new MySqlCommand(consulta, conexion);
            // Creamos un DataSet que contendra los datos de la BD en local
            datos = new DataSet();
            // El adaptador será el puente de union entre la BD y en DataSet
            adaptador = new MySqlDataAdapter();
            // Cargamos el comando en el adapatador
            adaptador.SelectCommand = comando;
            // Aqui es donde se realiza la consulta SQL y la guardamos en el dataset, 
            //dentro de un datatable llamado miParticipantes (Un dataset es un cto de dataTables)
            adaptador.Fill(datos, "misParticipantes");
            // Guardamos la nueba tabla de nuestro DataSet en un dataTable
            DataTable tablaParticipantes = datos.Tables["misParticipantes"];
            //Definimos la clave principal de la tabla para pòder hacer posteriores busquedas con el metodo find()
            tablaParticipantes.PrimaryKey = new DataColumn[] { tablaParticipantes.Columns["DNI_Participante"] };
            //Cargamos los nombres y apellidos 
            lb_Nombre_F1.Text = Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[0][6])[1]) + " " + Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[0][6])[2]);
            lb_Nombre_F2.Text = Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[0][7])[1]) + " " + Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[0][7])[2]);
            lb_Nombre_SF1.Text = Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[1][6])[1]) + " " + Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[1][6])[2]);
            lb_Nombre_SF2.Text = Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[1][7])[1]) + " " + Convert.ToString(tablaParticipantes.Rows.Find(miFinal.Rows[1][7])[2]);
            //Cargamos los puntos 
            tb_Ptos_F1.Text = Convert.ToString(miFinal.Rows[0][8]);
            tb_Ptos_F2.Text = Convert.ToString(miFinal.Rows[0][9]);
            tb_Ptos_SF1.Text = Convert.ToString(miFinal.Rows[1][8]);
            tb_Ptos_SF2.Text = Convert.ToString(miFinal.Rows[1][9]);
            //Cargamos los dni (ocultos)
            lb_DNI_F1.Text = Convert.ToString(miFinal.Rows[0][6]);
            lb_DNI_F2.Text = Convert.ToString(miFinal.Rows[0][7]);
            lb_DNI_SF1.Text = Convert.ToString(miFinal.Rows[1][6]);
            lb_DNI_SF2.Text = Convert.ToString(miFinal.Rows[1][7]);
        }

        //Metodo que me inscribe los combates correspoindientes a la ronda
        private void inscribirCombatesRonda()
        {

            string consulta;
            MySqlConnection conexion = cls.ConexionMySQL.IniciarConexion();
            //Primero eliminamos los registros antiguos correspondientes a los participantes para la competicion y ronda
            consulta = "DELETE FROM combates WHERE Ronda = 3 AND Id_Competicion = " + this.idCompeticion;
            comando = new MySqlCommand(consulta, conexion);
            comando.ExecuteNonQuery();

            //Combate del 1A contra 2B
            Combate miCombate1 = new Combate();
            miCombate1.Id_Competicion = this.idCompeticion;
            //Usare la Liga para diferenciar los combates de la primera y segunda semifinal - final
            miCombate1.Liga = 11;
            miCombate1.Ronda = 3;
            miCombate1.Participante_Primero = 11;
            miCombate1.Participante_Segundo = 22;
            miCombate1.Dni_1 = lb_DNI_F1.Text;
            miCombate1.Dni_2 = lb_DNI_F2.Text;
            miCombate1.Puntuacion_1 = 0;
            miCombate1.Puntuacion_2 = 0;
            miCombate1.Activo = true;
            miCombate1.InsertarCombate();

            //Combate de 1B contra 2A
            Combate miCombate2 = new Combate();
            miCombate2.Id_Competicion = this.idCompeticion;
            miCombate2.Liga = 22;
            miCombate2.Ronda = 3;
            miCombate2.Participante_Primero = 21;
            miCombate2.Participante_Segundo = 12;
            miCombate2.Dni_1 = lb_DNI_SF1.Text;
            miCombate2.Dni_2 = lb_DNI_SF2.Text;
            miCombate2.Puntuacion_1 = 0;
            miCombate2.Puntuacion_2 = 0;
            miCombate2.Activo = true;
            miCombate2.InsertarCombate();
        }

        private void btn_Guardar_Finales_Click(object sender, EventArgs e)
        {
            if (miResultado != null)
                miResultado.Dispose();
            ModificarCombatesRonda(dt_Final, 3);
            List<Puntuacion> listadoFinal = calcularClasificacionFinal();
            miResultado = new Resultados(listadoFinal);
            miVentanaCompeticion.TableLayoutPanel1.Controls.Add(miResultado, 1, 1);
        }

        //Metodo que me inserta en una lista de objetos tipo puntuacion todos los resultados finales de la liga para asi ordenarlos
        private List<Puntuacion> calcularClasificacionFinal()
        {
            List<Puntuacion> listado = new List<Puntuacion>();

            if (Convert.ToInt32(tb_Ptos_F1.Text) > Convert.ToInt32(tb_Ptos_F2.Text))
            {
                Puntuacion miPuntuacion1 = new Puntuacion();
                miPuntuacion1.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[2]);
                miPuntuacion1.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[0]);
                miPuntuacion1.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[6]);
                miPuntuacion1.Ptos = 400;
                listado.Add(miPuntuacion1);
                Puntuacion miPuntuacion2 = new Puntuacion();
                miPuntuacion2.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[2]);
                miPuntuacion2.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[0]);
                miPuntuacion2.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[6]);
                miPuntuacion2.Ptos = 300;
                listado.Add(miPuntuacion2);
            }
            else
            {
                Puntuacion miPuntuacion1 = new Puntuacion();
                miPuntuacion1.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[2]);
                miPuntuacion1.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[0]);
                miPuntuacion1.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F2.Text)[6]);
                miPuntuacion1.Ptos = 400;
                listado.Add(miPuntuacion1);
                Puntuacion miPuntuacion2 = new Puntuacion();
                miPuntuacion2.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[2]);
                miPuntuacion2.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[0]);
                miPuntuacion2.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_F1.Text)[6]);
                miPuntuacion2.Ptos = 300;
                listado.Add(miPuntuacion2);
            }
            if (Convert.ToInt32(tb_Ptos_SF1.Text) > Convert.ToInt32(tb_Ptos_SF2.Text))
            {
                Puntuacion miPuntuacion3 = new Puntuacion();
                miPuntuacion3.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[2]);
                miPuntuacion3.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[0]);
                miPuntuacion3.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[6]);
                miPuntuacion3.Ptos = 200;
                listado.Add(miPuntuacion3);
                Puntuacion miPuntuacion4 = new Puntuacion();
                miPuntuacion4.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[2]);
                miPuntuacion4.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[0]);
                miPuntuacion4.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[6]);
                miPuntuacion4.Ptos = 100;
                listado.Add(miPuntuacion4);
            }
            else
            {
                Puntuacion miPuntuacion3 = new Puntuacion();
                miPuntuacion3.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[2]);
                miPuntuacion3.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[0]);
                miPuntuacion3.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF2.Text)[6]);
                miPuntuacion3.Ptos = 200;
                listado.Add(miPuntuacion3);
                Puntuacion miPuntuacion4 = new Puntuacion();
                miPuntuacion4.Nombre = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[1]) + " " + Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[2]);
                miPuntuacion4.Dni = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[0]);
                miPuntuacion4.Club = Convert.ToString(miVentanaCompeticion.Dt_Participantes.Rows.Find(lb_DNI_SF1.Text)[6]);
                miPuntuacion4.Ptos = 100;
                listado.Add(miPuntuacion4);
            }
            listado.Sort(delegate(Puntuacion x, Puntuacion y) { return y.Ptos.CompareTo(x.Ptos); });
            return listado;
        }

        //Metodo que aplicado al evento de un texbox me dice me lo bloquea si semete cualquier cosa que no se aun numero
        private void validarTexBoxNumerico(object sender, KeyPressEventArgs e)
        {
            //Para obligar a que sólo se introduzcan números 
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else
                if (Char.IsControl(e.KeyChar)) //permitir teclas de control como retroceso 
                {
                    e.Handled = false;
                }
                else
                {
                    //el resto de teclas pulsadas se desactivan 
                    e.Handled = true;
                }
        } 

        public Resultados MiResultado
        {
            get { return miResultado; }
            set { miResultado = value; }
        }

    }
}
